package com.atguigu.boot.config;

import ch.qos.logback.core.db.DBHelper;
import com.atguigu.boot.bean.Car;
import com.atguigu.boot.bean.Pet;
import com.atguigu.boot.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

/**
 * 1.配置类中使用@Bean标注在方法上给容器注册组件,默认也是单实例的
 * 2.配置类本身也是组件
 * 3.proxyBeanMethods: 代理Bean的方法
 *      Full(proxyBeanMethods = true)
 *      Lite(proxyBeanMethods = false)
 *      组件依赖必须使用Full模式,其他默认是Lite模式
 * 4.@Import({User.class,DBHelper.class})
 *      给容器中自动创建出这两个类型的组件,默认组件的名字就是全类名
 */
// @Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false) // 告诉SpringBoot这是一个配置类 == 配置文件
@ConditionalOnMissingBean(name = "tom")
@ImportResource({"classpath:beans.xml"})
@EnableConfigurationProperties({Car.class})
//1.开启Car配置绑定功能
//2.把Car组件自动注册到容器中
public class MyConfig {

    /**
     * 外部无论对配置类中的这个组件注册方法调用了多少次都是之前容器中的单实例对象
     * @return
     */
    @ConditionalOnBean(name = "tom") // 当容器中有tom的时候,才注册user01
    @Bean // 给容器中添加组件, 以方法名作为组件的id, 返回值类型就是组件类型. 返回的值就是组件在容器中的实例
    public User user01(){
        User zhangsan = new User("张三",18);
        // User依赖了Pet组件
        zhangsan.setPet(tomcatPet());
        return zhangsan;
    }

    // @Bean("tom") // 组件自定义名字
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}
